package cn.tuling.example;

/**
 * 例子：大闸蟹的做法有很多种，我们以清蒸大闸蟹和红烧大闸蟹两种方法为例，介绍策略模式的应用
 * 定义一个大闸蟹加工的抽象策略类（CrabCooking），里面包含了一个做菜的抽象方法 CookingMethod()；
 * 然后，定义清蒸大闸蟹（SteamedCrabs）和红烧大闸蟹（BraisedCrabs）的具体策略类，它们实现了抽象策略类中的抽象方法；
 * 最后，定义一个厨房（Kitchen）环境类，它具有设置和选择做菜策略的方法；客户类通过厨房类获取做菜策略
 */
public class StrategyTest {
    public static void main(String[] args) {
        Kitchen kitchen = new Kitchen();
        kitchen.setCrabCooking(new SteamedCrabs());
        kitchen.cookingCrabs();
        System.out.println("----------");
        kitchen.setCrabCooking(new BraisedCrabs());
        kitchen.cookingCrabs();
    }
}

interface CrabCooking {
    void cookingMethod();
}

class SteamedCrabs implements CrabCooking {

    @Override
    public void cookingMethod() {
        System.out.println("清蒸大闸蟹");
    }
}

class BraisedCrabs implements CrabCooking {

    @Override
    public void cookingMethod() {
        System.out.println("红烧大闸蟹");
    }
}

class Kitchen {
    private CrabCooking crabCooking;

    public void setCrabCooking(CrabCooking crabCooking) {
        this.crabCooking = crabCooking;
    }

    public void cookingCrabs() {
        crabCooking.cookingMethod();
    }
}